#!/usr/bin/awk -f
#-------------------------------------------------------
#	FileName	: mreplace.awk
#	Author		：hpy
#	Date		：2021年08月18日
#	Description	：
#-------------------------------------------------------

#-------------------------------------------------------------------------------
#                                 使用说明
#-------------------------------------------------------------------------------
# 用于替换,使用实例 
# 存在文件 src.txt ,其中内容为:
#       R1 1234 a
#       R2 R1 b 
#       C123 5214 c
#       R1 114O d
# 我们替换的映射关系文件 conf.txt 内容为:
#       R1 YHP
#       C20 110
# 我们希望将 src.txt 文件中第一列为 R1和C20的行,以空格或者tab为分隔符,将其第二列的数据
# 分别替换为 YHP 和 110 ,处理完后的输出文件所有行的第1列和第2列,但是将暑促文件的分隔符替换
# 为逗号 ,则可以使用 mreplace.awk脚本执行如下命令
#     ./mreplace.awk -v OFS="," ID=1 CID=2 PALL=1 OC1=1 OC2=1  conf.txt src.txt 
#--------------------------------------------------------------------------------
#       上述指令的具体含义为?:
#                   OFS="," : 指定输出分隔符为逗号
#                   ID=1   : 指定目标文件的第1列作为行id(索引)
#                   CID=2   : 指定要替换的内容为第二列 
#                   PALL=1  : 打印替换后的所有行
#                   OC1=1 OC2=1 : 将处理后的文件第 1列和第 2列输出打印
#                   conf.txt   : 替换映射文件 (需要保证分割符号一致)
#                   src.txt    :目标文件
#---------------------------------------------------------------------------------
#    其中PALL OC1~OC20 用于标志,一旦你在调用 mreplace.awk脚本使用 -v 定义了他们,他们就会在
#    脚本中本执行,否则执行默认状态
#---------------------------------------------------------------------------------
# 支持的输入 -v 变量作用如下:
# FS: 指定文件分隔符,不指定时默认采用空格和制表符为分隔符
# OFS: 指定输出内容的分隔符,不指定时默认采用空格为分隔符
# ID: 指定目标文件的第级列作为行id(索引) , 不指定时默认 第 1列为ID列
# CID:指定要替换内容为列 , 不指定时默认为第1列
# PALL:指定是只显示替换的行还是显示所有行,包括没有替换的行, 不指定时默认只显示替换了的行
# OC1 ~ OC20 :指定输出显示哪些列 , 不指定的列默认输出不显示
#---------------------------------------------------------------------------------

 
BEGIN {
    #可以在输入配置的参数
    ID = ID ? ID : 1     # 将第几列作为ID列,或者作为数据的id/索引
    CID = CID ? CID : 1  # 要替换的列
}

function mprint(str,cur , cNF) {
    ostr = (cur==CID && arr[$ID])? arr[$ID] : str   
    if(cur==1){
         printf("%s",ostr)
    } else {
        if(flag==1)
            printf("%s%s",OFS,ostr)
        else printf("%s",ostr)
    }
    # if(cur==cNF) printf("\n")
}

{
    # 读入替换的映射关系 
    if(NR==FNR){
        arr[$1]=$2
    }

    if(NR>FNR) {
        if(arr[$ID] || PALL) {  # ID存在于替换列表 或者显示处理后的所有行内容
            flag = 0
            for ( i =1 ;i<= NF ; i++) {
                if( OC1 && i==1) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC2 && i==2) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC3 && i==3) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC4 && i==4) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC5 && i==5) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC6 && i==6) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC7 && i==7) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC8 && i==8) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC9 && i==9) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC10 && i==10) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC11 && i==11) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC12 && i==12) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC13 && i==13) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC14 && i==14) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC15 && i==15) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC16 && i==16) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC17 && i==17) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC18 && i==18) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC19 && i==19) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
                if( OC20 && i==20) {mprint($i , i ,NF);flag = flag==0? 1 : 0}
            }
            printf("\n")
        }
    }
}